import { ref } from "vue";
import { invoke } from "@tauri-apps/api/core";

export function useAppConfig(key: string) {
  let appConfigCache: any = null;
  const appConfigCurrent = ref<any>({});
  const isLoading = ref(true);
  const isReady = ref(false);

  const getConfig = async () => {
    try {
      isLoading.value = true;
      const config = await invoke<any>("get_app_config");
      appConfigCache = config;
      appConfigCurrent.value = config[key] || {};
      isReady.value = true;
    } catch (error) {
      isReady.value = false;
    } finally {
      isLoading.value = false;
    }
  };

  // 立即开始加载配置
  getConfig();

  // 等待配置加载完成
  const waitForReady = async () => {
    if (isReady.value) return;

    // 如果正在加载，等待加载完成
    while (isLoading.value) {
      await new Promise((resolve) => setTimeout(resolve, 50));
    }

    // 如果还没准备好，尝试重新加载
    if (!isReady.value) {
      await getConfig();
    }

    if (!isReady.value) {
      throw new Error("配置加载失败，无法保存");
    }
  };

  // 更新配置
  const updateConfig = async () => {
    try {
      // 确保配置已加载
      await waitForReady();

      if (!appConfigCache) {
        throw new Error("配置缓存为空");
      }

      // 更新配置缓存
      appConfigCache[key] = appConfigCurrent.value;

      // 保存到后端
      await invoke("set_app_config", { newCfg: appConfigCache });
    } catch (e) {
      throw new Error("更新失败: " + e);
    } finally {
      // 重新加载配置以确保同步
      await getConfig();
    }
  };

  // 设置配置
  const setConfig = async (value: any) => {
    try {
      // 确保配置已加载
      await waitForReady();

      if (!appConfigCache) {
        throw new Error("配置缓存为空");
      }

      // 更新配置
      appConfigCache[key] = value;
      appConfigCurrent.value = value;

      // 保存到后端
      await invoke("set_app_config", { newCfg: appConfigCache });
    } catch (e) {
      throw new Error("更新失败: " + e);
    } finally {
      // 重新加载配置以确保同步
      await getConfig();
    }
  };

  return {
    appConfigCurrent,
    isLoading,
    isReady,
    getConfig,
    updateConfig,
    setConfig,
  };
}
